package com.itheima.reggie.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.reggie.dao.*;
import com.itheima.reggie.pojo.*;
import com.itheima.reggie.service.OrdersService;
import com.itheima.reggie.utils.UUIDUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.swing.text.Utilities;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Service
public class OrdersServiceImpl implements OrdersService {
    @Autowired
    private OrderDao orderDao;

    @Autowired
    private OrdersDetailDao ordersDetailDao;

    @Autowired
    private AddressBookDao addressBookDao;

    @Autowired
    private ShoppingCartDao shoppingCartDao;

    @Autowired
    private UserDao userDao;

    @Override
    public Page<Orders>findByPage(Integer pageNum, Integer pageSize,String orderId, LocalDateTime orderStart, LocalDateTime orderEnd) {
        List<Orders> ordersList = orderDao.findAll(orderId,orderStart,orderEnd);
        return new Page<>(ordersList);
    }

    @Override
    public void submit(Orders orders) {
        Long userId = orders.getUserId();
//        1. 通过用户id，查询当前用户的购物车数据
//        2. 根据当前登录用户id, 查询用户数据 (需要创建持久层方法)
        List<ShoppingCart> cartItemByUserId = shoppingCartDao.findCartItemByUserId(userId);
//        3. 根据订单地址ID, 查询地址数据
        User user = userDao.findById(orders.getUserId());
        Long bookId = orders.getAddressBookId();
        AddressBook addressBook = addressBookDao.getById(bookId);
//        4. 通过工具类生成uuid的订单id (在资料中提供了工具类)
        Integer orderId = UUIDUtils.getUUIDInOrderId();

        BigDecimal amount = BigDecimal.ZERO;
//        5. 声明变量记录总金额，供后面使用
        Integer number = 0;
//        6. 声明变量为0，用于统计共有多少件商品
//        7. 创建一个订单项集合
        List<OrderDetail> orderDetailList = new ArrayList<OrderDetail>();
//        8. 遍历所有的购物项，一个购物项就是一个订单明细
        for (ShoppingCart shoppingCart : cartItemByUserId) {
            //        8.1. 创建订单明细对象
//        8.2  购物车与订单明细表中相同的属性可以直接复制
//        8.3. 设置订单项目的主键，使用uuid工具类生成
//        8.4. 订单项所属的订单的id(上面生成的订单id)
//        8.5  累加总数量
//        8.6. 计算当前购物项的总价：数量乘以单价
//        8.7. 再累加到上面定义的总价变量中
//        8.8. 添加到购物车项集合中
            OrderDetail orderDetail = new OrderDetail();
            BeanUtils.copyProperties(shoppingCart, orderDetail);
            orderDetail.setId(UUIDUtils.getUUIDInOrderId().longValue());
            orderDetail.setOrderId(orderId.longValue());
            number += orderDetail.getNumber();
            BigDecimal price= orderDetail.getAmount().multiply(BigDecimal.valueOf(orderDetail.getNumber()));
            amount = amount.add(price);
            orderDetailList.add(orderDetail);
        }

//        9. 组装订单数据, 使用方法的参数orders
//        9.1. 设置订单号
//        9.2. 设置商品的数量
//        9.3. 设置状态码为1
//        9.4. 设置下单时间为现在
//        9.5. 设置支付时间为现在时间加30分钟
//        9.6. 设置总金额
//        9.7. 设置登录用户名
//        9.8. 设置收货电话
//        9.9. 设置收货地址
//        9.10. 收货人consignee
        orders.setNumber(String.valueOf(number));
        orders.setId(orderId.longValue());
        orders.setStatus(1);
        orders.setCheckoutTime(LocalDateTime.now().plusMinutes(30));
        orders.setOrderTime(LocalDateTime.now());
        orders.setAmount(amount);
        orders.setPhone(addressBook.getPhone());
        orders.setConsignee(addressBook.getConsignee());
        orders.setAddress(addressBook.getDetail());
//        10. 调用orderMapper插入订单 (编写新的持久层方法)
        orderDao.addOrders(orders);
//        11. 调用orderDetailMapper批量插入订单项 (编写新的持久层方法)
        ordersDetailDao.addbatchs(orderDetailList);
//        12. 删除当前用户的购物车列表数据
        shoppingCartDao.deleteCartItemByUserId(userId);
    }
}
